﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace BeanboxSoftware.BeanProxy.Internals
{
  /// <summary>
  /// A MethodConfig of a wrapped method of type C which takes 1 parameter(s) of type(s) T1
  /// </summary>
  /// <typeparam name="C">MulticastDelegate</typeparam>
  /// <typeparam name="T1">parameter 1 type</typeparam>
  public abstract class MethodConfig<C, T1> : MethodConfig<C>
  {
    public MethodConfig(MethodConfig access) : base(access) { }
    /// <summary>
    /// Get the last value passed to parameter 1
    /// </summary>
    public T1 Param1 { get { return (T1)Access.GetParameter(0); } }
  }
  /// <summary>
  /// A MethodConfig of a wrapped method of type C which takes 1 parameter(s) of type(s) T1 and T2
  /// </summary>
  /// <typeparam name="C">MulticastDelegate</typeparam>
  /// <typeparam name="T1">parameter 1 type</typeparam>
  /// <typeparam name="T2">parameter 2 type</typeparam>
  public abstract class MethodConfig<C, T1, T2> : MethodConfig<C, T1>
  {
    public MethodConfig(MethodConfig access) : base(access) { }
    /// <summary>
    /// Get the last value passed to parameter 2
    /// </summary>
    public T2 Param2 { get { return (T2)Access.GetParameter(1); } }
  }
  /// <summary>
  /// A MethodConfig of a wrapped method of type C which takes 1 parameter(s) of type(s) T1, T2, and T3
  /// </summary>
  /// <typeparam name="C">MulticastDelegate</typeparam>
  /// <typeparam name="T1">parameter 1 type</typeparam>
  /// <typeparam name="T2">parameter 2 type</typeparam>
  /// <typeparam name="T3">parameter 3 type</typeparam>
  public abstract class MethodConfig<C, T1, T2, T3> : MethodConfig<C, T1, T2>
  {
    public MethodConfig(MethodConfig access) : base(access) { }
    /// <summary>
    /// Get the last value passed to parameter 3
    /// </summary>
    public T3 Param3 { get { return (T3)Access.GetParameter(2); } }
  }
  /// <summary>
  /// A MethodConfig of a wrapped method of type C which takes 1 parameter(s) of type(s) T1, T2, T3, and T4
  /// </summary>
  /// <typeparam name="C">MulticastDelegate</typeparam>
  /// <typeparam name="T1">parameter 1 type</typeparam>
  /// <typeparam name="T2">parameter 2 type</typeparam>
  /// <typeparam name="T3">parameter 3 type</typeparam>
  /// <typeparam name="T4">parameter 4 type</typeparam>
  public abstract class MethodConfig<C, T1, T2, T3, T4> : MethodConfig<C, T1, T2, T3>
  {
    public MethodConfig(MethodConfig access) : base(access) { }
    /// <summary>
    /// Get the last value passed to parameter 4
    /// </summary>
    public T4 Param4 { get { return (T4)Access.GetParameter(3); } }
  }
  /// <summary>
  /// A MethodConfig of a wrapped method of type C which takes 1 parameter(s) of type(s) T1, T2, T3, T4, and T5
  /// </summary>
  /// <typeparam name="C">MulticastDelegate</typeparam>
  /// <typeparam name="T1">parameter 1 type</typeparam>
  /// <typeparam name="T2">parameter 2 type</typeparam>
  /// <typeparam name="T3">parameter 3 type</typeparam>
  /// <typeparam name="T4">parameter 4 type</typeparam>
  /// <typeparam name="T5">parameter 5 type</typeparam>
  public abstract class MethodConfig<C, T1, T2, T3, T4, T5> : MethodConfig<C, T1, T2, T3, T4>
  {
    public MethodConfig(MethodConfig access) : base(access) { }
    /// <summary>
    /// Get the last value passed to parameter 5
    /// </summary>
    public T5 Param5 { get { return (T5)Access.GetParameter(4); } }
  }
}
